#ifndef INTERPRETADORMEPA_H_
#define INTERPRETADORMEPA_H_
#include <vector>
#include <string>
#include <sstream>
#include "Arquivo.h"
#include "InterpretadorMepa.h"
#include <sstream>
#include <stdio.h>

using namespace std;

class InterpretadorMepa
{
public:
	InterpretadorMepa(vector<LinhaMepa> &, vector<string>&);
	virtual ~InterpretadorMepa();
	/* Instrucoes do arquivo 3cop066-a13-t02 */
	void CRCT();
	void CRVL();
	void SOMA();
	void SUBT();
	void MULT();
	void DIVI();
	void INVR();
	void CONJ();
	void DISJ();
	void NEGA();
	void CMME();
	void CMMA();
	void CMIG();
	void CMDG();
	void CMEG();
	void CMAG();
	/*
	 * intrucoes a13-t03
	 */
	void ARMZ();
	void DSVS();
	void DSVF();
	void NADA();
	void LEIT();
	void IMPR();
	void IMPL();
	void IMPC();
	void INPP();
	void AMEM();
	void PARA();
	/*
	 * intrucoes a15-t01
	 */
	 void CREN();
	/*
	 * Le uma linha do arquivo da MEPA
	 */
	 void CHPR();
	 void ENPR();
	 void RTPR();
	 void DMEM();
	 //---------------------
	 void CRVI();
	 void ARMI();
	 void MOSM();
	 
	 //-------------
	 void RegBase(string );
	 void P(string);
	 void M(string);
	 void help();
	 void R(string);
	 void I();
	 void E();
	 void ExecutaMepa();
	 
	
private:
	string *mP; //regiao de programa que contem instrucoes da mepa
	string *mM; //regiao de dados que contem valores manipulados pelas instrucoes da mepa
	int *mD; //vetor de registradores base, contendo apontadores para regiao M
	int mI; //endereco da proxima instrucao a ser executada
	int mS; //endereco do topo da pilha
	vector<LinhaMepa> mMepa;
	LinhaMepa mCorrent; // linha corrente da MEPA
	int mN; // tamanho de registradores de entrada
	string mMOSM;
	string mArquivoMEPA;
	int mTP;
	int mTM;
	int mTD;
};

#endif /*INTERPRETADORMEPA_H_*/
